"use strict";

/**
 * 参数收集
 * this.request.inParams:{
 *  files: 数组, 从body中解析代表上传的文件
 *  body: json, 从body中解析的非文件
 *  qs: json,query string中的解析 如 /a/b?hello=1
 *  path: json, 路径参数, 如  /:foo/:bar
 *  fields: =body(json)+qs(json)+path(json) 除了文件外所有的集合(如果body.qs.path中没有重名的字段,则放在这里最方便)
 * }
 * 考虑到 除了文件外,所有的
 */
var merge = require('merge');
var bodyParser = require('koa-better-body');
var Router = require('koa-router');
var koaBody = bodyParser({});

var __pathPrefix = '/'; // 所有请求都需要 params_collector
var router = new Router({prefix: __pathPrefix});
module.exports = router.routes();

/**
 * TODO 路径参数无法从 request.inParams.xx中获取
 * TODO request header中 需设置 application/json
 *
 * 仍然需要从 this.params.xxx中得到
 * @param next
 */
function * collect(next) {
  //console.log('url=%s pass params collector',this.request.url);
  var inParams = {};
  inParams.files = this.request.body && this.request.body.files;
  inParams.body = this.request.body && this.request.body.fields;
  inParams.qs = this.query;
  inParams.path = this.params;
  inParams.fields = {};
  merge(inParams.fields, inParams.body);
  merge(inParams.fields, inParams.qs);
  for (var key of Object.keys(inParams.path)) {
    if (key == 0 || key == 1) continue;
    inParams.fields[key] = inParams.path[key];
  }
  this.request.inParams = inParams;
  //console.log(inParams);
  yield next;
}

router.all('**', koaBody, collect);

